package eventbus

import (
	"sync"
)

// EventBus 事件总线 - 实用主义设计
type EventBus struct {
	handlers map[string][]func(data interface{})
	mu       sync.RWMutex
}

// NewEventBus 创建事件总线
func NewEventBus() *EventBus {
	return &EventBus{
		handlers: make(map[string][]func(data interface{})),
	}
}

// On 订阅事件
func (bus *EventBus) On(event string, handler func(data interface{})) {
	bus.mu.Lock()
	defer bus.mu.Unlock()
	bus.handlers[event] = append(bus.handlers[event], handler)
}

// Emit 触发事件（同步执行）
func (bus *EventBus) Emit(event string, data interface{}) {
	bus.mu.RLock()
	handlers := bus.handlers[event]
	bus.mu.RUnlock()

	for _, handler := range handlers {
		handler(data)
	}
}

// EmitAsync 异步触发事件
func (bus *EventBus) EmitAsync(event string, data interface{}) {
	bus.mu.RLock()
	handlers := bus.handlers[event]
	bus.mu.RUnlock()

	for _, handler := range handlers {
		h := handler // 捕获循环变量
		go func() {
			// 增加panic恢复，避免单个handler的panic影响整个程序
			defer func() {
				if r := recover(); r != nil {
					// 这里可以记录日志，但因为是简化版，就静默处理
					_ = r
				}
			}()
			h(data)
		}()
	}
}

// Off 取消订阅（如果需要的话）
func (bus *EventBus) Off(event string) {
	bus.mu.Lock()
	defer bus.mu.Unlock()
	delete(bus.handlers, event)
}

// DefaultBus 全局简单事件总线
var DefaultBus = NewEventBus()

// On 便捷方法
func On(event string, handler func(data interface{})) {
	DefaultBus.On(event, handler)
}

func Emit(event string, data interface{}) {
	DefaultBus.Emit(event, data)
}

func EmitAsync(event string, data interface{}) {
	DefaultBus.EmitAsync(event, data)
}
